package com.yuw.untils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


public class MyUtils {

    /**
     * 文件上传处理
     *
     * @param request                 请求对象
     * @param strFileFieldName        form表单中的input文件上传控件的name属性的值
     * @param strUploadFileSubDirName 服务器上保存文件的目录名【所有的文件都保存在服务器的 fileUpload 目录下】
     * @return 上传文件的相对路径访问地址（保存到数据库）
     */
    public static String uploadFile(HttpServletRequest request, String strFileFieldName, String strUploadFileSubDirName) throws ServletException, IOException {
        // 返回值
        String strFileRelativeFilePath = "";

        // 从request对象中，获取form表单中的文件流对象,这个文件流对象，就放在part中，通过文件对象控件的name属性值获取文件流对象
        Part partUserImg = request.getPart(strFileFieldName); // 获取的form表单的文件对象； 参数是form表单的 file控件的name属性值

        // 将文件上传到服务器指定目录
        // (1) 给上传文件进行重命名【避免重复】
        // 获取上传文件的后缀名
        String fileSubfix = "jpg"; // 默认类型为jpg  // 需要根据业务逻辑确定
        String[] arrContentType = partUserImg.getSubmittedFileName().split("\\.");  // 上传文件的原始名字 user.png
        if (arrContentType != null && arrContentType.length > 0) {
            fileSubfix = arrContentType[arrContentType.length - 1];
        }

        // UUID工具类，进行文件新文件命名，避免文件名的重复
        String strNewFileName = UUID.randomUUID().toString() + "." + fileSubfix;
        // (2) 创建上传文件保存的目录文件夹
        // D:\yuwworkspace\QSTWorkspace\QSTWorkspace_DZ202003\dz_javaweb20200415\out\artifacts\dz_javaweb20200415_war_exploded\fileUpload
        String strServerFilePath = request.getServletContext().getRealPath("fileUpload"); // 要求在开发项目的web目录下新建一个fileUpload文件夹
        // 检查该文件夹是否在服务器已经创建，如果没有创建，则先创建在使用
        // file工具类
        File fileServerFilePath = new File(strServerFilePath + "/" + strUploadFileSubDirName);
        if (!fileServerFilePath.exists()) {
            // 创建目录
            fileServerFilePath.mkdirs();
        }

        // (3) 使用新的文件名上传文件到服务器指定目录
        // 上传文件的完整路径名字
        String strUploadFileName = strServerFilePath + "/" + strUploadFileSubDirName + "/" + strNewFileName; // 上传文件的绝对路径
        try {
            partUserImg.write(strUploadFileName); // 以write写出的方式将文件内容使用给定的文件名写到指定的服务器上
        } catch (IOException e) {
            System.out.println("文件上传异常：" + e.getMessage());
        }

        // 将文件上传到服务器的项目于 / 目录的路径名保存到数据库
        strFileRelativeFilePath = "fileUpload" + "/" + strUploadFileSubDirName + "/" + strNewFileName; // 相对路径名
        // 保存到实体类的文件对象的userImg属性上
        return strFileRelativeFilePath;
    }


    /**
     * 将日期字符串转换为日期对象[要求：日期字符串和模式串之间要一一对应]
     *
     * @param strDate    日期字符串
     * @param strPattern 日期字符串的模式串
     * @return 转换之后的日期对象
     */
    public static Date convertString2Date(String strDate, String strPattern) {
        // 默认返回值（根据业务逻辑取null还是取当前日期）
        Date date = null; // 取null为默认值
        //Date date = new Date(); // 取当前时间为默认值
        // 当日期字符串不为空时进行转换处理
        if (!strDate.isEmpty()) {
            // 判断是否给定了日期字符串的模式串
            strPattern = strPattern.isEmpty() ? "yyyy-MM-dd HH:mm:ss" : strPattern;
            // 创建日期格式化工具类的实例对象
            SimpleDateFormat sdf = new SimpleDateFormat(strPattern);
            try {
                // 将日期字符串转换为日期对象
                date = sdf.parse(strDate);
            } catch (ParseException e) {
                System.out.println("日期字符串转换为日期对象类型异常：" + e.getMessage());
            }
        }
        return date;
    }

    /**
     * 将日期对象转换为指定格式的格式化字符串
     *
     * @param date       被转化日期对象
     * @param strPattern 目标日期字符串的模式串
     * @return 转换之后的日期字符串
     */
    public static String convertDate2String(Date date, String strPattern) {
        // 默认返回值（根据业务逻辑取null还是取当前日期）
        String strDate = null;
        // 当日期字符串不为空时进行转换处理
        if (date != null) {
            // 判断是否给定了日期字符串的模式串
            strPattern = strPattern.isEmpty() ? "yyyy-MM-dd HH:mm:ss" : strPattern;
            // 创建日期格式化工具类的实例对象
            SimpleDateFormat sdf = new SimpleDateFormat(strPattern);
            // 格式化处理
            strDate = sdf.format(date);
        }
        return strDate;
    }
}